import java.util.ArrayList;
import java.util.PriorityQueue;

//给定一个长度为 n 的可能有重复值的数组，找出其中不去重的最小的 k 个数。
// 例如数组元素是4,5,1,6,2,7,3,8这8个数字，则最小的4个数字是1,2,3,4(任意顺序皆可)。

//堆排序 优先级队列
//step 1：利用input数组中前k个元素，构建一个大小为k的大顶堆，堆顶为这k个元素的最大值。
//step 2：对于后续的元素，依次比较其与堆顶的大小，若是比堆顶小，则堆顶弹出，再将新数加入堆中，直至数组结束，保证堆中的k个最小。
//step 3：最后将堆顶依次弹出即是最小的k个数。
public class Solution {
    public ArrayList<Integer> GetLeastNumbers_Solution (int[] input, int k) {
        ArrayList<Integer> res = new ArrayList<>();
        if(k == 0 || input.length == 0){
            return res;
        }
        //建大堆
        PriorityQueue<Integer> queue = new PriorityQueue<>((o1, o2) -> o2.compareTo(o1));
        for(int i = 0; i < k; i++){
            queue.add(input[i]);
        }
        for(int i = k; i < input.length; i++){
            if(input[i] < queue.peek()){
                queue.poll();
                queue.add(input[i]);
            }
        }
        for(int i = 0; i < k; i++){
            res.add(queue.poll());
        }
        return res;
    }
}
